﻿using CommonModel.Model;
using CommonModel.Util;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Ptllib
{
    public class PtlImp
    {
        //xml配置信息
        static Dictionary<string, SchemaDocument> cfgs = new Dictionary<string, SchemaDocument>();
        static string _ver = "30Wor50W_Digit50W";

        public static string getver() { return _ver; }

        //ptlsvr根据matchCfg.xml的配置，把配置信息设置
        public static void setCfg(Dictionary<string, SchemaDocument> cfgs)
        {
            PtlImp.cfgs = cfgs;
        }

        //解析帧头，判断是否匹配本DLL接口
        public static bool matching(byte[] data)
        {
            //30W模拟调频发射机，50W自研数字电视发射机和水冷系统，第一字节0x25
            byte[] flag_1 = data.Skip(15).Take(1).ToArray();
            string flag1 = TransForm.ByteToHexStringBigEndian(flag_1);//转为十六进制字符串

            if (flag1.Equals("25"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /*
         * 解析数据
         * data前15位 IP占4位，端口占2位，时间戳占8位, 协议类别1位 共15位
         */
        public static string convert(byte[] data)
        {
            Dictionary<string, Object> parsedDataDictionary = new Dictionary<string, Object>();
            //通用自研：第一字节0x25，第二字节0x5a
            byte[] flag_1 = data.Skip(15).Take(1).ToArray();
            byte[] flag_2 = data.Skip(16).Take(1).ToArray();
            string flag1 = TransForm.ByteToHexStringBigEndian(flag_1);//转为十六进制字符串
            string flag2 = TransForm.ByteToHexStringBigEndian(flag_2);
            HeaderData header = null;

            if (flag1.Equals("25") && flag2.Equals("5a"))//解析帧头
            {// 30W模拟调频发射机, 50W自研数字电视发射机 主动上报帧
                header = ParseSvr.ByteParseToHead30Wor50W(data);
            }
            else
            {// 50W央广发射机以及水冷系统, 4级台站30W调频发射机，1+1切换控制器，通用协议格式的
                header = ParseSvr.ByteParseToHeadDigit50W(data);
            }

            if (null == header || header.ErrorFlag.Equals("yes"))
            {
                return null;
            }

            ParseSvr.DecorateHead(header);//修正帧头数据

            //增加header信息获取厂家为空时的判断
            if (null == header.Vendor || header.Vendor.Equals("技术中心"))
            {
                header.Vendor = "0x0000";
            }
            string schemaName = "";
            if (header.Device.Equals("0x00") || header.Device.Equals("0x0703") || header.Device.Equals("0x0401"))
            {
                schemaName = header.Device + "_" + header.Vendor + "_" + header.MsgType;
            }
            else
            {
                schemaName = header.Device + "_" + header.Vendor + "_" + header.Hardware + "_" + header.Software + "_" + header.MsgType;
            }
            SchemaDocument doc = null;
            if (cfgs.ContainsKey(schemaName))
            {
                doc = cfgs[schemaName];// 获取对应的xml解析文件

                if (doc.getMsgType().Equals("struct"))
                {
                    parsedDataDictionary = Struct.ByteParseViaStruct(doc, data, header.Bodybegin);
                }
                else
                {
                    //要区分300W/1000W的
                    parsedDataDictionary = Code.ByteParseViaCode(doc, data, "");
                }

            }
            else
            {
#if DEBUG
                Console.WriteLine("获取解析协议配置失败, 应该获取的协议名称: " + schemaName);
#endif
                return null;
            }
            string jsondata = "";
            //拼接发送的json数据
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            string unix_timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
            Dictionary<string, object> resultDict = new Dictionary<string, object>();//发送下去的总json数据
            Dictionary<string, string> ptlDict = new Dictionary<string, string>();

            ptlDict.Add("ptlver", "ptl ver info");
            ptlDict.Add("ts", unix_timestamp);//时间戳
            ptlDict.Add("ptlnode", "");//协议转换节点

            Dictionary<string, string> addDict = new Dictionary<string, string>();
            addDict.Add("ip", header.Ip);//ip地址
            addDict.Add("port", header.Port.ToString());//端口
            addDict.Add("sid", header.Stationcode);//台站id
            if (flag1.Equals("25") && flag2.Equals("5a"))//解析帧头
            {// 30W模拟调频发射机, 50W自研数字电视发射机 主动上报帧
                addDict.Add("addr", parsedDataDictionary["shebeidizhi"].ToString());
                addDict.Add("sn", parsedDataDictionary["SN"].ToString());
            }
            else
            {// 50W央广发射机以及水冷系统, 4级台站30W调频发射机，1+1切换控制器，通用协议格式的
                if (parsedDataDictionary.ContainsKey("devid"))
                {
                    addDict.Add("addr", parsedDataDictionary["devid"].ToString());//配置文件中只找到devid
                }
                else
                {
                    addDict.Add("addr", "");//配置文件中只找到devid
                }

                addDict.Add("sn", "");//配置文件中没有
            }

            addDict.Add("paramId", doc.getId());

            resultDict.Add("ptlinfo", ptlDict);
            resultDict.Add("addr", addDict);
            resultDict.Add("datas", parsedDataDictionary);

            jsondata = JsonConvert.SerializeObject(resultDict);
            return jsondata;
        }
    }
}
